
// 读取 Excel 文档的内容

/**
 * 读取本地excel文件
 * @param file 文件
 * @param callback 回调
 */
export function readWorkbookFromLocalFile(file, callback) {
  const reader = new FileReader()
  reader.onload = function(e) {
    const data = e.target.result
    const workbook = XLSX.read(data, {type: 'binary'})
    if(callback) callback(workbook)
  }
  reader.readAsBinaryString(file)
}

/**
 * 读取网络文件
 * @param url 远程文件的URL
 * @param callback 回调
 */
export function readWorkbookFromRemoteFile(url, callback) {
  const xhr = new XMLHttpRequest()
  xhr.open('get', url, true)
  xhr.responseType = 'arraybuffer'
  xhr.onload = function(e) {
    if(xhr.status == 200) {
    var data = new Uint8Array(xhr.response)
    var workbook = XLSX.read(data, {type: 'array'})
      if(callback) callback(workbook)
    }
  }
  xhr.send()
}

// 建立 sheet 集合 state.sheets
const toSheet = (state, sheetNames) => {
  // state.sheetNames
  state.sheetNames.length = 0
  state.sheetNames.push(...sheetNames)

  // state.sheets 
  sheetNames.forEach(name => {
    state.sheets[name] = []
  })
}

// 建立表和字段
const toTable = (json, state, sheetName) => {

  // 遍历记录集
  json.forEach(code => {
    if (code['字段编号'] === 0) {
      // 这条记录是表
      // state.sheets[sheetName] = []
      const newTable = {
        tableID: code['表编号'], // 表编号
        tableName: code['字段名'], // 表名
        cnName: code['中文名'], // 中文名称
        content: code['说明']??'', // 表的说明
        cols: [] // 字段集合
      }

      state.tables[code['表编号']] = newTable
      state.sheets[sheetName].push(newTable)

    } else {
      // 这条记录是字段
      let columnId = ''
      if (code['表编号']) {
        columnId = code['表编号']
        if (code['字段编号']) {
          columnId += code['字段编号'].toString().padStart(3,'0')
        } else {
          console.log('字段编号:', code['字段编号'])
        }
      } else {
        console.log('表编号:', code['表编号'])
      }

      const col = { 
        tableId: code['表编号'], // 表编号
        columnId: columnId, // 字段编号
        colName: code['字段名'], // 字段名称
        cnName: code['中文名'], // 中文名称
        colType: code['类型'], // 字段类型，nvarchar、int 等
        colSize: code['大小'], // 大小
        defaultValue: code['默认值']??'', // 默认值
        canNull: code['允许空'] === 0 ? false: true, // 允许空
        controlTypeId: code['控件类型']?? 101, // 控件类型
        content: code['说明'] // 字段说明
      }
      
      if (state.tables[code['表编号']]?.cols) {
        state.tables[code['表编号']].cols.push(col)
      } else {
        console.log('出错：', code['表编号'])
      }
    }
  })
}

/**
 * 读取 excel 文件，分析内容，变成数据
 * @param file 
 * @param state 
 * @param callback 
 */
export function loadDataFile (file, state, callback) {

  readWorkbookFromLocalFile(file, (workbook) => {
    // console.log(workbook)
    const sheetNames = workbook.SheetNames // 工作表名称集合
    // 设置工作簿
    toSheet(state, sheetNames)

    // 打开每一个工作簿
    sheetNames.forEach(name => {
      if (name !== 'Sheet1') {
        const worksheet = workbook.Sheets[name] // 这里我们只读取第一张sheet
        const json = XLSX.utils.sheet_to_json(worksheet)
        // 设置表
        toTable(json, state, name)
      }
    })
  
		if(callback) callback(workbook)

  })
}


/**
 * 读取 远程 excel 文件，分析内容，变成数据
 * @param url 
 * @param state 
 * @param callback 
 */
 export function loadWebDataFile (url, state, callback) {

  readWorkbookFromRemoteFile(url, (workbook) => {
    // console.log(workbook)
    const sheetNames = workbook.SheetNames // 工作表名称集合
    // 设置工作簿
    toSheet(state, sheetNames)

    // 打开每一个工作簿
    sheetNames.forEach(name => {
      if (name !== 'Sheet1') {
        const worksheet = workbook.Sheets[name] // 这里我们只读取第一张sheet
        const json = XLSX.utils.sheet_to_json(worksheet)
        // 设置表
        toTable(json, state, name)
      }
    })

		if(callback) callback(workbook)

  })
}


/**
 * 中文名: "产品代码"
允许空: 0
大小: 50
字段名: "ProductCode"
字段编号: 20
是否建立字段: 1
是否添加到配置信息: 1
类型: "nvarchar"
表编号: 4000
说明: "无限极的统一编码"
 */